package oop;

/*练习1：
 * 创建一个类 Student，包含以下属性：
 * name（学生姓名）
 * age（学生年龄）
 * studentId（学生ID）
 * 请将这些属性设置为私有，并为每个属性提供公共的getter和setter方法。此外，创建一个构造函数来初始化所有属性，并提供一个方法 displayInfo() 来打印学生的信息。
 * */
public class Practice01 {
    public static void main(String[] args) {
        //题目需要的方法：使用无参构造函数为对象进行初始化操作
        Student mjf = new Student();
        //下面三行赋值操作，不能直接使用诸如 mjf.name 的方式进行访问，因为在 Student类中三个字段是私有的。因此只能通过 get和 set方法进行访问
        mjf.setName("小马哥");
        mjf.setAge(25);
        mjf.setStudentId("226152107");
        mjf.displayInfo();

        //补充方法：使用有参构造函数为对象进行初始化操作
        /*此处我的疑问：有参构造方法在初始化对象值的时候经过 get 和 set方 法了吗？
        解答：使用有参构造函数初始化对象时，会直接通过传入的参数为私有字段赋值，不需要经过 get 和 set 方法。
            get 和 set 方法是为类外部提供对私有字段的访问权限的。当对象已经创建并且你希望在对象生命周期中修改或获取字段的值时，可以使用这些方法。
        * */
        Student jwy = new Student("jingweiyu", 25, "226152123");
        jwy.displayInfo();
    }
}

class Student {
    public Student(String name, int age, String studentId) { //有参构造函数对对象进行初始化
        this.name = name;
        this.age = age;
        this.studentId = studentId;
    }
    public Student(){ //使用有参构造函数时，必须显式的写出无参构造函数
        // 可以给字段设置默认值，也可以不设置
        this.name = "默认姓名";
        this.age = 18;
        this.studentId = "000000000";
    }
    //定义三个私有属性
    private String name;
    private int age;
    private String studentId;
    //编写三个属性的get和set方法，以便在Student类外部访问到它们
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getStudentId() {
        return studentId;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        if (age > 0 && age < 100) {
            this.age = age;
        } else {
            this.age = 3;
            System.out.println("年龄不符合常理！");
        }
    }

    public void setStudentId(String studentId) {
        if (studentId!=null && studentId.length()==9){ // 假设学生id为 9位
            this.studentId = studentId;
        }
        else {
            System.out.println("学生id不符合格式");
        }
    }
    //定义显示信息的方法
    public void displayInfo() {
        System.out.println("学生信息为：" + this.name +"\t"+ this.age +"\t"+ this.studentId);
    }
}
